package dca.sistemascontrole.handler;

import dca.sistemascontrole.dao.GraphicDataManager;
import dca.sistemascontrole.driver.GerenciadorComunicacao;
import dca.sistemascontrole.malhadecontrole.Clock;
import dca.sistemascontrole.malhadecontrole.Controlador;
import dca.sistemascontrole.malhadecontrole.MalhaAberta;
import dca.sistemascontrole.malhadecontrole.MalhaDeControle;
import dca.sistemascontrole.malhadecontrole.MalhaFechada;
import dca.sistemascontrole.sinais.Degrau;
import dca.sistemascontrole.sinais.Sinal;
import dca.sistemascontrole.util.ControleConstantes;
import dca.sistemascontrole.util.XMLManager;
import dca.sistemascontrole.view.DialogoConfigurarPortas;
import dca.sistemascontrole.view.MainFrame;
import dca.sistemascontrole.view.components.VariaveisObservaveis;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JFileChooser;

/**
 *
 * @author Rafael
 */
public class HandlerMainFrame {

    private Clock clock;
    private MainFrame mainFrame;
    private Controlador controlador;
    private MalhaDeControle malhaDeControle = new MalhaAberta();
    private GraphicDataManager graphicDataManager = new GraphicDataManager();
    private GerenciadorComunicacao gerenciadorComunicacao = new GerenciadorComunicacao();

    public HandlerMainFrame() {
        clock = new Clock(this);
        this.mainFrame = new MainFrame(this);
    }

    public void startSendingMalhaAberta(String amplitude, String periodo, String tempoAtuacao, int tipoDeSinal) {
        Sinal sinal = Sinal.gerarSinal(tipoDeSinal, Float.parseFloat(periodo) * 1000, Float.parseFloat(amplitude), Float.parseFloat(tempoAtuacao) * 1000);
        malhaDeControle = new MalhaAberta(sinal);
        
    }

    public void stopSendingMalhaAberta() {
        malhaDeControle = new MalhaAberta();
    }

    public void sendTensaoStandAlone(String tensao_) {
        float tensao = Float.parseFloat(tensao_);
        Degrau degrau = new Degrau(tensao, Float.MAX_VALUE);

        malhaDeControle = new MalhaAberta(degrau);
    }

    public void setSetpoint(String setpoint_) {
        float setpoint = Float.parseFloat(setpoint_);

        if (malhaDeControle instanceof MalhaFechada) {
            ((MalhaFechada) malhaDeControle).setSetpoint(setpoint);
        } else {
            malhaDeControle = new MalhaFechada(setpoint);
        }

    }

    public void showDialogoConfiguração() {
        DialogoConfigurarPortas dialogoConfigurarPortas = new DialogoConfigurarPortas(mainFrame, true, gerenciadorComunicacao);
        dialogoConfigurarPortas.setVisible(true);
    }

    public void iniciar() {
        clock.start();

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                mainFrame.setVisible(true);
            }
        });
    }

    public synchronized void setVariaveisObservaveis(VariaveisObservaveis variaveisObservaveis) {
        mainFrame.setVariaveisObsrvaveis(variaveisObservaveis);
        
        graphicDataManager.addSinalControle(variaveisObservaveis.getTensaoEscrita());
        graphicDataManager.addTanqueInferior(variaveisObservaveis.getNivelTankInfeior());
        graphicDataManager.addTanqueSuperior(variaveisObservaveis.getNivelTankSuperior());
    }

    public void saveGraphicData() throws FileNotFoundException, IOException {
        JFileChooser fileChooser = new JFileChooser(new File(ControleConstantes.FILE_CONFIGURACAO));
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int option = fileChooser.showOpenDialog(mainFrame);
        
        if (option == JFileChooser.APPROVE_OPTION) {
            String absolutePath = fileChooser.getSelectedFile().getAbsolutePath();
            
            XMLManager.writeObject(graphicDataManager, absolutePath + "." + ControleConstantes.FILE_IDENTIFICADOR_DADOS);
        }
    }

    public void runControlador() {
        if (controlador == null || controlador.isDone()) {
            controlador =  new Controlador(malhaDeControle, this, gerenciadorComunicacao);
            controlador.execute();
        }       
    }
}
